// wygzgyw
#include <bits/stdc++.h>
using namespace std;
template <typename T> void read(T &t) {
	t=0; char ch=getchar(); int f=1;
	while (ch<'0'||ch>'9') { if (ch=='-') f=-1; ch=getchar(); }
	do { (t*=10)+=ch-'0'; ch=getchar(); } while ('0'<=ch&&ch<='9'); t*=f;
}
template <typename T> void write(T t) {
	if (t<0) { putchar('-'); write(-t); return; }
	if (t>9) write(t/10);
	putchar('0'+t%10);
}
template <typename T> void writeln(T t) { write(t); puts(""); }
#define MP make_pair
typedef unsigned long long ull;
typedef long long ll;
const int mod=(1e9)+7;
int n,m;
char rub[310];
int d[310][310],_d[310][310];
int dp[2][310][1<<17];
ull f[1<<17],g[1<<17];
pair<int,int> num[310]; int tot,bit[1<<17];
int you[310],bel[2][310][310],col[310],rev[1<<17];
int sum[2][310];
void update(int &x,int y) { x+=y; if (x>=mod) x-=mod; }
void update(ull &x,ull y) { x+=y; if (x>=mod) x-=mod; }
void solve(int op) {
	for (int i=1;i<=tot+1;i++) for (int t=0;t<(1<<m);t++) dp[op][i][t]=0;

	tot=0; for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) num[++tot]=MP(i,j),col[tot]=d[i][j],bel[op][i][j]=tot;
	dp[op][1][0]=1;
	for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) for (int k=j;k<=m;k++) if (d[i][j]==d[i][k]) you[bel[op][i][j]]=k-j+1; else break;
	for (int i=1;i<=tot+1;i++) for (int t=0;t<(1<<m);t++) if (dp[op][i][t]) {
//		printf("dp[%d][%d]=%d\n",i,t,dp[op][i][t]);
		update(sum[op][i],dp[op][i][t]);
		if (i>tot) continue;
		int s=t;
		s|=(1<<(num[i].second-1)); update(dp[op][i+1][s],dp[op][i][t]);
		s=t;
		for (int j=i;j<=i+you[i]-1;j++) {
			if (s>>(num[j].second-1)&1) s^=(1<<(num[j].second-1));
			if (j!=i) update(dp[op][j+1][s],dp[op][i][t]);
		}
		if ((t>>(num[i].second-1)&1)&&col[i]==col[i-m]) {
			update(dp[op][i+1][t],dp[op][i][t]);
		}
	}

}
void print() {
	for (int i=1;i<=n;i++) {
		for (int j=1;j<=m;j++) printf("%d ",d[i][j]); puts("");
	}
}
int ans[310][310];
void FWT(ull *a,int N,int op,int msk=(1<<m)-1) {
	int tmp;
	for (int i=1;i<N;i*=2) if (msk&i) {
		tmp=i*2;
		for (int j=0;j<N;j+=tmp)
		for (int k=0;k<i;k++)
			if (op==1) update(a[j+k],a[i+j+k]);
			else update(a[j+k],mod-a[i+j+k]);
	}
//	for (int i=0;i<N;i++) if (a[i]) a[i]=(a[i]%mod+mod)%mod;
}
int main() {
	freopen("disanti.in","r",stdin);
	freopen("disanti.out","w",stdout);
//	printf("MLE %d\n",sizeof(dp)/1024/1024);
	read(n),read(m);
	int flag=0;
	if (n<m) flag=1;
	for (int i=1;i<=n;i++) {
		scanf("%s",rub+1);
		for (int j=1;j<=m;j++) (flag?d[j][i]:d[i][j])=(rub[j]=='1');
	}
	if (flag) swap(n,m);
	assert(m<=17);
	for (int t=1;t<(1<<m);t++) {
		bit[t]=bit[t-(t&(-t))]+1;
		for (int j=0;j<m;j++) if (t>>j&1) rev[t]|=(1<<(m-j-1));
	}
	solve(0);
	for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) _d[i][j]=d[n-i+1][m-j+1];
	for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) d[i][j]=_d[i][j];
	solve(1);
	for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) _d[i][j]=d[n-i+1][m-j+1];
	for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) d[i][j]=_d[i][j];
	
	for (int i=1;i<=n*m;i++) {
		for (int t=0;t<(1<<m);t++) f[rev[t]]=dp[1][i][t];
		for (int t=0;t<(1<<m);t++) dp[1][i][t]=f[t];
	}
	memset(f,0,sizeof(f));
	memset(g,0,sizeof(g));
	for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) {
		//if (j==2&&i==2); else continue;
		d[i][j]^=1; int R;
		//print();
		for (int t=0;t<(1<<m);t++) f[t]=g[t]=0;
		for (int l=j;l>=1;--l) {
			if (d[i][l]!=d[i][j]) break;
			int msk=0,x=bel[0][i][l];
			for (int k=1;k<l;++k) if (i<n&&d[i][k]==d[i+1][k]) msk|=(1<<k-1);
			for (int k=j+1;k<=m;k++) msk|=(1<<(k-1));
			for (int t=0;t<(1<<m);++t) update(f[t&msk],dp[0][x][t]);
			//printf("%d %d\n",l,msk);
		}
		for (int r=j;r<=m;++r) {
			if (d[i][r]!=d[i][j]) break;
			int y=bel[1][n-i+1][m-r+1];
			int msk=0;
			for (int k=1;k<j;k++) msk|=(1<<(k-1));
			for (int k=r+1;k<=m;++k) if (i>1&&d[i][k]==d[i-1][k]) msk|=(1<<k-1);
			for (int t=0;t<(1<<m);++t) update(g[t&msk],dp[1][y][t]);
			//printf("%d %d\n",r,msk);
		}
		//printf("l=%d,r=%d,msk=%d\n",l,r,msk);
		//	for (int t=0;t<(1<<mx);t++) printf("t=%d,f=%d,g=%d\n",t,f[t],g[t]);
		FWT(f,1<<m,1),FWT(g,1<<m,1);
		for (int t=0;t<(1<<m);++t) f[t]=(ll)f[t]*g[t]%mod;
		FWT(f,1<<m,-1);
		for (int t=0;t<(1<<m);++t) {
			if (f[t]) {
				update(ans[i][j],(ll)f[t]*(1<<bit[t])%mod);
			} f[t]=g[t]=0;
		}
	//	printf("ans=%d\n",ans[i][j]);
		
		for (int t=0;t<(1<<m);t++) f[t]=g[t]=0;
		int x=bel[0][i][j],y=bel[1][n-i+1][m-j+1],msk=0;
		for (int k=1;k<j;++k) if (i<n&&d[i][k]==d[i+1][k]) msk|=(1<<k-1);
		for (int k=j+1;k<=m;++k) if (i>1&&d[i][k]==d[i-1][k]) msk|=(1<<k-1);
		if (i>1&&d[i][j]==d[i-1][j]) {
			for (int t=0;t<(1<<m);t++) if (t>>(j-1)&1) update(f[t&msk],dp[0][x][t]);
			for (int t=0;t<(1<<m);t++) update(g[t&msk],dp[1][y][t]);
			FWT(f,1<<m,1,msk),FWT(g,1<<m,1,msk);
			for (int t=0;t<(1<<m);t++) f[t]=(ll)f[t]*g[t]%mod;
			FWT(f,1<<m,-1,msk);
			for (int t=0;t<(1<<m);t++) {
				if (f[t]) update(ans[i][j],(ll)f[t]*(1<<bit[t])%mod);
				f[t]=g[t]=0;
			}
		}
		if (i<n&&d[i][j]==d[i+1][j]) {
			for (int t=0;t<(1<<m);++t) if (t>>(j-1)&1) update(g[t&msk],dp[1][y][t]);
			for (int t=0;t<(1<<m);++t) update(f[t&msk],dp[0][x][t]);
			FWT(f,1<<m,1,msk),FWT(g,1<<m,1,msk);
			for (int t=0;t<(1<<m);t++) f[t]=(ll)f[t]*g[t]%mod;
			FWT(f,1<<m,-1,msk);
			for (int t=0;t<(1<<m);t++) {
				if (f[t]) update(ans[i][j],(ll)f[t]*(1<<bit[t])%mod);
				f[t]=g[t]=0;
			}
		}
		if (i>1&&i<n&&d[i][j]==d[i+1][j]&&d[i][j]==d[i-1][j]) {
			for (int t=0;t<(1<<m);++t) if (t>>(j-1)&1) update(f[t&msk],dp[0][x][t]);
			for (int t=0;t<(1<<m);++t) if (t>>(j-1)&1) update(g[t&msk],dp[1][y][t]);
			FWT(f,1<<m,1,msk),FWT(g,1<<m,1,msk);
			for (int t=0;t<(1<<m);t++) f[t]=(ll)f[t]*g[t]%mod;
			FWT(f,1<<m,-1,msk);
			for (int t=0;t<(1<<m);t++) {
				if (f[t]) update(ans[i][j],(ll)f[t]*(1<<bit[t])%mod);
				f[t]=g[t]=0;
			}
		}
		
		d[i][j]^=1;
	}
	
	/*for (int i=1;i<=n;i++) {
		for (int j=1;j<=m;j++) {
			d[i][j]^=1;
			solve(0);
			for (int k=0;k<(1<<m);k++) update(ans[i][j],dp[0][n*m+1][k]);
			d[i][j]^=1;
		}
	}*/
	if (flag) {
		for (int i=1;i<=m;i++) { for (int j=1;j<=n;j++) printf("%d ",ans[j][i]); puts(""); }
	} else {
		for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) printf("%d ",ans[i][j]); puts(""); }
	}
	return 0;
}
